#include <QtGui>
#include <QtQml>

#include "message.h"
#include "singletontypeexample.h"

// Second, define the singleton type provider function (callback).
static QObject *example_qobject_singletontype_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
{
    Q_UNUSED(engine)
    Q_UNUSED(scriptEngine)

    SingletonTypeExample *example = new SingletonTypeExample();
    return example;
}

int main(int argc, char **argv)
{
    QGuiApplication app(argc, argv);
    /*
     c++扩展qml有三类办法：
     1. 直接在c++中new一个qobject对象，使用setContextProperty设置到qml上下文属性中，当作属性使用
     2. 使用qmlRegisterType系列函数将一个qobject子类注册到qml中，在qml中像使用普通qml对象一样使用
        2.1 qmlRegisterInterface（）注册具有特定QML类型名称的Qt接口类型。该类型不能从QML实例化，但可以通过其类型名称引用。
        2.2 qmlRegisterUncreatableType（）注册一个不可实例化的命名C ++类型，但应该可以识别为QML类型系统的类型。如果类型的枚举或附加属性应该可以从QML访问但类型本身不应该是可实例化的，那么这很有用。
        2.3 qmlRegisterSingletonType（）注册可以从QML导入的单例类型，
     3. qml插件，以动态库的形式提供一个qml插件，qml导入插件，像普通qml对象一样使用 见cityui和fileio插件

     以上是qml中访问c++对象的方法
     c++访问qml对象也是可以的，但不推荐，破环了ui逻辑和业务逻辑分离的原则
*/

    // 注册一个可实例化的类型
    qmlRegisterType<Message>("com.mycompany.messaging", 1, 0, "Message");


    // 注册一个单例类型，也可用lambda
    qmlRegisterSingletonType<SingletonTypeExample>("Qt.example.qobjectSingleton", 1, 0, "MyApi", example_qobject_singletontype_provider);

    QUrl source(QStringLiteral("qrc:/main.qml"));
    QQmlApplicationEngine engine;
    engine.load(source);
    return app.exec();
}
